iT邦幫忙

2024 iThome 鐵人賽

DAY 15
1

在 CI/CD 流程中,需要在測試和正式環境分別執行,因此必須在 BigQuery 建立測試環境,並告訴 dbt 如何區分這兩種環境。

首先,我們要在 profiles.yml 中為每個環境定義與數據庫的連線。我們團隊需要正式環境和測試環境(用於 CI 測試),分別定義為 "prod" 和 "ci"。以下是 profiles.yml 的範例:

migo-dbt:
	target: ci # 預設為 ci
	outputs:
		prod:
      dataset: joshua
      job_execution_timeout_seconds: 1800
      job_retries: 2
      location: US
      method: oauth
      priority: interactive
      project: joshua-1000
      threads: 8
      type: bigquery
    ci:
      dataset: joshua_ci
      job_execution_timeout_seconds: 1800
      job_retries: 2
      location: US
      method: oauth
      priority: interactive
      project: joshua-1000
      threads: 8
      type: bigquery

先前文章中有介紹到我們團隊是透過 dataset 名稱後面加上 ci 來作為測試環境的 dataset,並且有說明我們是如何改寫 dbt 內建的 get_custom_schema macro 來讓 dataset 名稱加上 ci。

get_custom_schema 中會判斷 target 是指定為 “prod” 還是 “ci”,如果是 “prod” 則使用原本 dataset 名稱,是 “ci” 則在名稱後面加上 _ci,完整的 macro code 可以參考之前文章。

定義完 profiles.yml 和改寫 get_custom_schema 後,在執行 dbt 指令時,加上 —target 就能指定這次運行要在測試環境還是正式環境,以上是範例指令:

# 正式環境
dbt run --select test_model --target prod
# 測試環境
dbt run --select test_model --target ci

註:在 profiles.yml 中有定義預設的 target 為 ci,如果未填寫 —target,運行指令會等同於填入 —target ci,會運行在測試環境。

如果正式環境和測試環境會用到不同的資料來源(測試環境使用測試資料),可以在 source.yml 中運用 target 來指定不同資料來源,範例程式碼如下:

version: 2
 
sources:
  - name: source_name 
    database: |
      {%- if  target.name == "ci" -%} raw_ci
      {%- elif target.name == "prod"  -%} raw_prod
      {%- else -%} invalid_database
      {%- endif -%}
    schema: source_schema

本篇文章介紹了如何透過 dbt taget 來區分正式和測試環境,下一篇將會介紹在 CI/CD 中如何使用 dbt CLI 指令識別異動 models。

參考


上一篇
Migo CI/CD 流程
下一篇
dbt state(上)
系列文
dbt 修煉之路30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言